package edu.upc.wib.controller;

import edu.upc.wib.entity.Credential;
import edu.upc.wib.entity.CriterioBusqueda;
import edu.upc.wib.entity.Usuario;
import edu.upc.wib.service.UsuarioService;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.ModelAndView;

/**
 *
 * @author gian
 */
@Controller("usuarioController")
public class UsuarioController {

    @Autowired
    private UsuarioService usuarioService;
    private static Logger log = LoggerFactory.getLogger(UsuarioController.class);

    @RequestMapping("/usuarios/index")
    public ModelAndView index() {
        ModelAndView mav = new ModelAndView("usuarios/index");
        List<Usuario> usuarios = usuarioService.obtenerTodos();
        CriterioBusqueda criterioBusqueda = new CriterioBusqueda();
        mav.addObject("usuarios", usuarios);
        mav.addObject("criterioBusqueda", criterioBusqueda);
        return mav;
    }

    @RequestMapping(value = "/usuarios/new", method = RequestMethod.GET)
    public ModelAndView newUsuario() {
        ModelAndView mav = new ModelAndView("usuarios/new");
        Usuario usuario = new Usuario();
        mav.getModelMap().put("usuario", usuario);
        return mav;
    }

    @RequestMapping(value = "/usuarios/new", method = RequestMethod.POST)
    public String createUsuario(@ModelAttribute("usuario") Usuario usuario, SessionStatus status) {
        usuarioService.obtener(usuario.getIdUsuario());
        status.setComplete();

        return "redirect:/pages/usuarios/index";

    }

    @RequestMapping(value = "/usuarios/edit", method = RequestMethod.GET)
    public ModelAndView editUsuario(@RequestParam("id") Integer id) {
        ModelAndView mav = new ModelAndView("usuarios/edit");
        Usuario usuario = usuarioService.obtener(id);
        mav.getModelMap().put("usuario", usuario);
        return mav;
    }

    @RequestMapping(value = "/usuarios/edit", method = RequestMethod.POST)
    public String update(@ModelAttribute("usuario") Usuario usuario, SessionStatus status) {
        try {
            usuarioService.actualizar(usuario);
            status.setComplete();
        } catch (Exception ex) {
        }
        return "redirect:/pages/usuarios/index";
    }

    @RequestMapping("/usuarios/delete")
    public ModelAndView delete(@RequestParam("id") Integer id) {
        ModelAndView mav = new ModelAndView("redirect:/pages/usuarios/index");
        Usuario usuario = usuarioService.obtener(id);
        usuarioService.eliminar(id);
        return mav;
    }

    @RequestMapping("/usuarios/login")
    public ModelAndView login() {
        ModelAndView mav = new ModelAndView("usuarios/login");
        Credential credential = new Credential();
        mav.getModelMap().put("credential", credential);
        return mav;
    }

    @RequestMapping(value = "/usuarios/autenticar", method = RequestMethod.POST)
    public ModelAndView autenticar(@ModelAttribute("credential") Credential credential, HttpServletRequest request) {
        ModelAndView mav;
        if (usuarioService.autenticar(credential.getCorreo(), credential.getPassword())) {
            request.getSession().setAttribute("credential", credential);
            mav = new ModelAndView("redirect:/pages/usuarios/index");
            return mav;
        }
        mav = new ModelAndView("usuarios/login");
        //Implementar properties para todos los mensajes
        mav.addObject("mensajeError", "Sus credenciales no son correctas, por favor verifique.");
        return mav;
    }

    @RequestMapping("/usuarios/logout")
    public String logout(HttpServletRequest request) {
        request.getSession().invalidate();
        return "redirect:/pages/usuarios/login";
    }

    @RequestMapping(value = "/usuarios/buscar", method = RequestMethod.POST)
    public ModelAndView buscar(@ModelAttribute("criterioBusqueda") CriterioBusqueda criterio, SessionStatus status) {
        ModelAndView mav = new ModelAndView("usuarios/resultadoBusqueda");
        log.info("resultado = " + usuarioService.buscarPorApellidoPaterno(criterio.getNombre()).size());
        mav.getModel().put("resultado", usuarioService.buscarPorApellidoPaterno(criterio.getNombre()));
        return mav;
    }

    // rv - TODO, esto es temporal
    @RequestMapping(value = "/usuarios/ModificarClave")
    public ModelAndView modificaClave() {
        ModelAndView mav;
        mav = new ModelAndView("usuarios/ModificarClave");
        return mav;
    }

    @RequestMapping(value = "/usuarios/RegistrarCuenta", method = RequestMethod.GET)
    public ModelAndView registrarCuenta() {
        ModelAndView mav = new ModelAndView("usuarios/RegistrarCuenta");
        Usuario usuario = new Usuario();
        mav.getModelMap().put("usuario", usuario);
        return mav;
    }

    @RequestMapping(value = "/usuarios/RegistrarCuenta", method = RequestMethod.POST)
    public ModelAndView registrarCuenta(@ModelAttribute("usuario") Usuario usuario, SessionStatus status) {
        ModelAndView mav = new ModelAndView("usuarios/RegistrarCuenta");

        try {
            usuario.setIdRol(2);
            usuarioService.crear(usuario);
            status.setComplete();
            mav = new ModelAndView("redirect:/pages/torneos/ConsultarTorneos");
            return mav;

        } catch (Exception ex) {
            mav.addObject("msg", ex.getMessage());
        }
        return mav;

    }

    @RequestMapping(value = "/usuarios/ModificarPerfil", method = RequestMethod.GET)
    public ModelAndView modificarPerfil(@RequestParam("idUsuario") Integer idUsuario) {
        ModelAndView mav = new ModelAndView("usuarios/ModificarPerfil");
        Usuario usuario = usuarioService.obtener(idUsuario);
        mav.getModelMap().put("usuario", usuario);
        return mav;
    }

    @RequestMapping(value = "/usuarios/ModificarPerfil", method = RequestMethod.POST)
    public ModelAndView modificarPerfil(@ModelAttribute("usuario") Usuario usuario, SessionStatus status) {
        ModelAndView mav = new ModelAndView("usuarios/ModificarPerfil");

        try {
            usuario.setIdRol(2);
            usuarioService.actualizar(usuario);
            status.setComplete();
            mav = new ModelAndView("redirect:/pages/torneos/ConsultarTorneos");
            return mav;

        } catch (Exception ex) {
            mav.addObject("msg", ex.getMessage());
        }
        return mav;

    }

    // rv - TODO, esto es temporal
    @RequestMapping(value = "/usuarios/ModificarPerfilAdm")
    public ModelAndView modificarPerfilAdm() {
        ModelAndView mav;
        mav = new ModelAndView("usuarios/ModificarPerfilAdm");
        return mav;
    }

    @InitBinder
    public void initBinder(WebDataBinder webDataBinder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        dateFormat.setLenient(false);
        webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
    }
}
